Processes, operations, and hardware devices of a processor system typically use memory devices to store information. In a pre-boot environment (i.e., prior to booting an operating system), a processor typically executes pre-boot firmware or software instructions associated with initializing various portions of a processor system. Such pre-boot instructions may be part of, for example, a basic input output system (BIOS), initialization processes of hardware devices (e.g., network devices, display devices, input devices, etc.), etc. Typically, when executed, at least some pre-boot instructions cause a processor to initialize memory devices for storing information. After initialization of the memory devices, any process or operation of the processor system may allocate one or more blocks of memory (i.e., memory blocks) within the memory devices.
Memory blocks in the memory devices may be accessed using any memory addressing technique including indirect memory addressing and direct memory addressing. A selected memory addressing technique may be particularly suited for a specific memory configuration or memory use model. For example, indirect memory addressing may be used in connection with a memory use model in which contents in the memory blocks within a memory device are relocated or shifted during operation of the processor system. More specifically, one example of indirect memory addressing involves addressing memory locations using an address offset from a base address. In general, the base address indicates a starting point address in memory and the address offset indicates the number of memory addresses between the base address and the address corresponding to the memory location at which the first byte of the particular memory block is stored. In some indirect memory addressing implementations, a table is used to store address offset values, each of which may be used to access information in a respective memory location or memory block. An address computation process may be used to add the address offset to the base address to determine the address at which the first byte of the particular memory block is stored. A process or operation with which the memory block is associated need only store the address offset to access the particular memory block because the address computation process is aware of the base address. When one or more memory blocks are relocated or shifted due to an expansion or contraction of allocated memory, the base address may be updated by a memory relocation process to reflect the new general location of the memory blocks. In this manner, relocation of memory blocks is transparent to any process or operation that uses indirect memory addressing.
In contrast to indirect addressing techniques, direct memory addressing involves using absolute addresses of particular contents stored in memory and may result in lower memory access latencies (i.e., faster memory access speeds) because an address computation process is not required to determine the location of a memory block. In this manner, an operation or process may use an absolute address to directly access an exact address of a respective memory block. An apparent problem associated with direct memory addressing is that when a memory block is relocated or shifted due to an expansion or contraction of allocated memory, an absolute address used to access the memory block must be updated.
Memory use associated with processes or operations of a processor system typically use indirect addressing to better handle memory block relocation and/or memory size changes. For example, in a pre-boot environment, BIOS and other firmware associated with hardware device initialization use indirect memory addressing to access a conventional memory for storing information that needs to be readily accessible. In the pre-boot environment, initialization processes for hardware devices or other portions of a processor system typically allocate many memory blocks in the conventional memory. Each time a memory block is allocated, a memory relocation process relocates or shifts existing memory blocks to relinquish space for a recently allocated memory block. Accesses to memory by processes or operations that use indirect memory addressing are typically not affected by the relocation of memory.
Although indirect memory addressing is well-suited for accessing memory blocks that are frequently relocated, processes that use direct memory addressing to access similar memory blocks often experience erroneous memory accesses after a memory relocation process. In particular, a memory relocation process typically handles relocation using indirect memory addressing and, therefore, is typically not aware of the location at which a process stores an absolute address corresponding to a respective memory block. As a result, during relocation of memory, a memory relocation process cannot update absolute addresses associated with relocated memory blocks of specific processes or operations that use direct memory addressing. Accordingly, memory relocation often results in erroneous addressing of information by processes or operations using direct memory addressing.